SpringSecurity -请求的地址栏使用”//“报错

前言

在使用 spring security 时,请求的地址栏使用 “//”的情况是后台报如下错误:

org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL contained a potentially malicious String "//"
at org.springframework.security.web.firewall.StrictHttpFirewall.rejectedBlacklistedUrls(StrictHttpFirewall.java:369)
at org.springframework.security.web.firewall.StrictHttpFirewall.getFirewalledRequest(StrictHttpFirewall.java:336)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:194)

问题所在

该错误发生的原因是 SpringSecurity设置了安全防护措施,在 StrictHttpFirewall类中设置了禁用,源码里面如下:

/**
* 因为这个allowUrlEncodedDoubleSlash 没有设置值.默认是false, 故不能识别 双 //
* 而 FORBIDDEN_DOUBLE_FORWARDSLASH 和 FORBIDDEN_DOUBLE_FORWARDSLASH 是 SpringSecurity源码中设置的全局变量
*/
public void setAllowUrlEncodedDoubleSlash(boolean allowUrlEncodedDoubleSlash) {
if (allowUrlEncodedDoubleSlash) {
this.urlBlacklistsRemoveAll(FORBIDDEN_DOUBLE_FORWARDSLASH);
} else {
this.urlBlacklistsAddAll(FORBIDDEN_DOUBLE_FORWARDSLASH);
}
}

解决

需要在自己项目中的 SpringSecurity配置类中添加如下配置即可:

/**
* 配置地址栏不能识别 // 的情况
* @return
*/
@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
//此处可添加别的规则,目前只设置 允许双 //
firewall.setAllowUrlEncodedDoubleSlash(true);
return firewall;
}